﻿using System;
using System.IO;
using System.Data;
using System.Windows;
using System.Collections;
using System.Windows.Input;
using System.ComponentModel;
using System.Windows.Controls;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Controls;
using Sinacor.Infra.UI.Controls.SmartClient;
using System.Collections.Generic;
using Sinacor.UI.Bovespa.ManutencaoOrdens.Presenter;
using Sinacor.Infra.UI.Controls.SmartClient.Validation;
using Sinacor.UI.Bovespa.Ordens.View.SmartClient;


namespace Sinacor.UI.Bovespa.ManutencaoOrdens.View.SmartClient
{
    public partial class ConsultaGeralOrdensNegocios : SinacorWindow, IConsultaGeralOrdensNegocios
    {

        #region Atributos
        public string _style = string.Empty;
        private bool _cancelDrag = false;
        public Presenter.ConsultaGeralOrdensNegocios _presenter { get; set; }
        private Model.NoDataPregao _dataPregaoAtual;
        #endregion

        #region Propriedades

        public Model.NoOrdem CurrentModelOrdem
        {
            get
            {
                return (Model.NoOrdem)this.detailsViewOrdens.SelectedItem;
            }
        }

        public Model.NoNegocio CurrentModelNegocio
        {
            get
            {
                return (Model.NoNegocio)this.detailsViewNegocios.SelectedItem;
            }
        }

        public Model.NoDataPregao CurrentModelDataPregao
        {
            get
            {
                return (Model.NoDataPregao)this.treeView.SelectedItem;
            }
        }

        #endregion

        #region Construtor
        public ConsultaGeralOrdensNegocios()
        {
            //Esta model precisa ser instanciada para o funcionamento dos ícones do listView
            Model.NoDataPregao data = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.NoDataPregao(new Model.Calendario());
            InitializeComponent();
            this._presenter = new Sinacor.UI.Bovespa.ManutencaoOrdens.Presenter.ConsultaGeralOrdensNegocios(this);
            this.DataContext = this._presenter;
            this.AfterInitialize += new RoutedEventHandler(ConsultaGeralOrdensNegocios_AfterInitialize);
        }

        void ConsultaGeralOrdensNegocios_AfterInitialize(object sender, RoutedEventArgs e)
        {
            _presenter.Inicializar();
            explorer.SelectedView = ExplorerDetailsView.DetailsView;
            _dataPregaoAtual = _presenter.TreeViewConsultaGeral[0] as Model.NoDataPregao;
        }

        #endregion

        #region MenuGridOrdens

        private void menuDtgOrdensMostrarNeg_Click(object sender, RoutedEventArgs e)
        {
            if (sender is SinacorContextMenuItem)
            {
                DtgPreBoletos.Visibility = Visibility.Collapsed;
                DtgExecsOrdem.Visibility = Visibility.Visible;
                DtgNegNaoCasados.Visibility = Visibility.Visible;
                listView.Visibility = Visibility.Collapsed;
                expExecucoesOrdem.Visibility = Visibility.Visible;
                expNegociosNaoCasados.Visibility = Visibility.Visible;
                expPreBoletos.Visibility = Visibility.Collapsed;

            }
        }

        private void menuDtgOrdensMostrarPreBol_Click(object sender, RoutedEventArgs e)
        {
            if (sender is SinacorContextMenuItem)
            {
                DtgPreBoletos.Visibility = Visibility.Visible;
                DtgExecsOrdem.Visibility = Visibility.Collapsed;
                DtgNegNaoCasados.Visibility = Visibility.Collapsed;
                expExecucoesOrdem.Visibility = Visibility.Collapsed;
                expNegociosNaoCasados.Visibility = Visibility.Collapsed;
                expPreBoletos.Visibility = Visibility.Visible;

            }
        }

        private void menuDtgOrdensMostrarPreBol_Loaded(object sender, RoutedEventArgs e)
        {
            if (sender is SinacorContextMenuItem)
            {
                if (detailsViewOrdens.SelectedItems.Count < 1)
                {
                    ((SinacorContextMenuItem)sender).IsEnabled = false;
                }

            }
        }

        private void menuDtgOrdensMostrarNeg_Loaded(object sender, RoutedEventArgs e)
        {
            if (sender is SinacorContextMenuItem)
            {
                if (detailsViewOrdens.SelectedItems.Count < 1)
                {
                    ((SinacorContextMenuItem)sender).IsEnabled = false;
                }
            }
        }

        private void menuDtgOrdensManutOrd_Click(object sender, RoutedEventArgs e)
        {
            if (CurrentModelOrdem != null)
            {
                Model.Ordem ordem = (Model.Ordem)this.detailsViewOrdens.SelectedItem;
                Model.ChaveOrdem chave = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.ChaveOrdem();
                chave.NumeroOrdem = ordem.NumeroOrdem.Value;
                chave.DataOrdem = ordem.DataOrdem;
                Sinacor.UI.Bovespa.ManutencaoOrdens.View.SmartClient.ManutencaoOrdens manutOrdens = new ManutencaoOrdens(chave);
                manutOrdens.Owner = this;
                manutOrdens.SetMenuHeader("Bovespa.Ordens.Label.Ordem");
                manutOrdens.ShowDialog();

                Model.Enum.NaturezaOperacao naturezaAnterior = CurrentModelOrdem.NaturezaOperacao.Value;

                Model.NoOrdem ordemOriginal = (Model.NoOrdem)Infra.Common.Serialization.CloneHelper.Clone(CurrentModelOrdem);

                Model.NoOrdem noOrdem = CurrentModelOrdem;


                if (manutOrdens.PresenterManutencaoOrdens.OrdemAtual != null)
                {
                    if (treeView.SelectedItem is Model.NoOrdem)
                    {

                        this.TraduzirOrdem(ref noOrdem, manutOrdens.PresenterManutencaoOrdens.OrdemAtual);

                        noOrdem.AtualizarText();

                        ModelCollection<Model.Ordem> source = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Ordem>();

                        source.Add((Model.Ordem)noOrdem);
                        detailsViewOrdens.ItemsSource = source;

                        this.detailsViewOrdens.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);

                        detailsViewNegocios.Visibility = Visibility.Collapsed;
                        detailsViewOrdens.Visibility = Visibility.Visible;

                    }
                    else if (((Model.NoSituacaoCasamento)treeView.SelectedItem).Parent.Parent is Model.NoTipoObjetoConsulta)
                    {


                        this.TraduzirOrdem(ref noOrdem, manutOrdens.PresenterManutencaoOrdens.OrdemAtual);

                        noOrdem.AtualizarText();

                        ModelCollection<Model.NoOrdem> source = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.NoOrdem>();


                        foreach (Model.NoOrdem item in ((Model.NoSituacaoCasamento)treeView.SelectedItem).Children)
                        {
                            if (item.DataOrdem == noOrdem.DataOrdem && item.NumeroOrdem == noOrdem.NumeroOrdem)
                            {
                                source.Add(noOrdem);
                            }
                            else
                                source.Add(item);
                        }

                        detailsViewOrdens.ItemsSource = source;

                        this.detailsViewOrdens.UpdateTarget(Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow.ItemProperty);

                        detailsViewNegocios.Visibility = Visibility.Collapsed;
                        detailsViewOrdens.Visibility = Visibility.Visible;
                    }


                    //Se houve alteração na natureza da operação
                    //Se for de compra pra venda
                    if (naturezaAnterior == Model.Enum.NaturezaOperacao.Compra && CurrentModelOrdem.NaturezaOperacao == Model.Enum.NaturezaOperacao.Venda)
                    {

                        ((Model.NoSituacaoCasamento)noOrdem.Parent).Children.Remove(noOrdem);

                        Model.NoNaturezaOperacao noNatureza = null;

                        foreach (var item in ((Model.NoTitulo)noOrdem.Parent.Parent.Parent.Parent.Parent).Children)
                        {
                            if (item.Natureza == Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.NaturezaOperacao.Venda)
                            {
                                noNatureza = item;
                                break;
                            }
                        }

                        Model.NoTipoObjetoConsulta noTipoObj = null;

                        foreach (var item in ((Model.NoNaturezaOperacao)noNatureza).Children)
                        {
                            if (item.TipoObjeto == Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoObjetoConsulta.Ordem)
                            {
                                noTipoObj = item;
                                break;
                            }
                        }

                        Model.NoDiscricionaria noDiscricionaria = null;

                        foreach (Model.NoDiscricionaria item in ((Model.NoTipoObjetoConsulta)noTipoObj).Children)
                        {
                            if (item.Discricionaria == ((Model.NoDiscricionaria)ordemOriginal.Parent.Parent).Discricionaria)
                            {
                                noDiscricionaria = item;
                                break;
                            }
                        }

                        Model.NoSituacaoCasamento noSituacaoCasamento = null;

                        foreach (Model.NoSituacaoCasamento item in ((Model.NoDiscricionaria)noDiscricionaria).Children)
                        {
                            if (item.Situacao == ((Model.NoSituacaoCasamento)ordemOriginal.Parent).Situacao)
                            {
                                noSituacaoCasamento = item;
                                break;
                            }
                        }


                        ModelCollection<Model.NoOrdem> source = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.NoOrdem>();

                        foreach (var item in detailsViewOrdens.Items)
                        {
                            source.Add((Model.NoOrdem)item);
                        }

                        source.Remove(noOrdem);
                        detailsViewOrdens.ItemsSource = source;
                        this.detailsViewOrdens.UpdateTarget(Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow.ItemProperty);

                        Model.NoOrdem novoNo = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.NoOrdem(noSituacaoCasamento, ordem);

                        noSituacaoCasamento.Children.Add(novoNo);
                        noOrdem.AtualizarText();
                    }
                    //Se for de venda pra compra
                    else if (naturezaAnterior == Model.Enum.NaturezaOperacao.Venda && CurrentModelOrdem.NaturezaOperacao == Model.Enum.NaturezaOperacao.Compra)
                    {

                        ((Model.NoSituacaoCasamento)CurrentModelOrdem.Parent).Children.Remove(noOrdem);

                        Model.NoNaturezaOperacao noNatureza = null;

                        foreach (var item in ((Model.NoTitulo)noOrdem.Parent.Parent.Parent.Parent.Parent).Children)
                        {
                            if (item.Natureza == Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.NaturezaOperacao.Compra)
                            {
                                noNatureza = item;
                                break;
                            }
                        }

                        Model.NoTipoObjetoConsulta noTipoObj = null;

                        foreach (var item in ((Model.NoNaturezaOperacao)noNatureza).Children)
                        {
                            if (item.TipoObjeto == Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoObjetoConsulta.Ordem)
                            {
                                noTipoObj = item;
                                break;
                            }
                        }

                        Model.NoDiscricionaria noDiscricionaria = null;

                        foreach (Model.NoDiscricionaria item in ((Model.NoTipoObjetoConsulta)noTipoObj).Children)
                        {
                            if (item.Discricionaria == ((Model.NoDiscricionaria)ordemOriginal.Parent.Parent).Discricionaria)
                            {
                                noDiscricionaria = item;
                                break;
                            }
                        }

                        Model.NoSituacaoCasamento noSituacaoCasamento = null;

                        foreach (Model.NoSituacaoCasamento item in ((Model.NoDiscricionaria)noDiscricionaria).Children)
                        {
                            if (item.Situacao == ((Model.NoSituacaoCasamento)ordemOriginal.Parent).Situacao)
                            {
                                noSituacaoCasamento = item;
                                break;
                            }
                        }

                        Model.NoOrdem novoNo = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.NoOrdem(noSituacaoCasamento, ordem);

                        noSituacaoCasamento.Children.Add(novoNo);

                        ModelCollection<Model.NoOrdem> source = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.NoOrdem>();

                        foreach (var item in detailsViewOrdens.Items)
                        {
                            source.Add((Model.NoOrdem)item);
                        }

                        source.Remove(noOrdem);
                        detailsViewOrdens.ItemsSource = source;
                        this.detailsViewOrdens.UpdateTarget(Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow.ItemProperty);

                        noOrdem.AtualizarText();
                    }
                }
            }
        }


        private void menuDtgOrdensManutOrd_Loaded(object sender, RoutedEventArgs e)
        {
            if (sender is SinacorContextMenuItem)
            {
                if (CurrentModelOrdem != null)
                {
                    if (!_presenter.Permissoes.PermiteAlterar || detailsViewOrdens.SelectedItems.Count < 1 && CurrentModelOrdem.NumeroOrdemSubSequencia < 1)
                    {
                        ((SinacorContextMenuItem)sender).IsEnabled = false;
                    }
                }
                else
                    ((SinacorContextMenuItem)sender).IsEnabled = false;

            }
        }

        private void menuDtgOrdensCancelOrd_Click(object sender, RoutedEventArgs e)
        {
            this.CancelarOrdem(CurrentModelOrdem);
        }

        private void menuDtgOrdensCancelOrd_Loaded(object sender, RoutedEventArgs e)
        {
            if (sender is SinacorContextMenuItem)
            {
                if (!_presenter.Permissoes.PermiteCancelar || detailsViewOrdens.SelectedItems.Count < 1 || CurrentModelOrdem.Situacao == Model.Enum.SituacaoOrdem.Cancelada)
                {
                    ((SinacorContextMenuItem)sender).IsEnabled = false;
                }
                else
                    ((SinacorContextMenuItem)sender).IsEnabled = true;
            }
        }

        #endregion

        #region MenuGridNegocios
        private void menuDtgNegAlteracaoNegocio_Click(object sender, RoutedEventArgs e)
        {
            if (CurrentModelNegocio != null)
            {
                if ((CurrentModelNegocio.QuantidadeCasada > 0 && CurrentModelNegocio.QuantidadeCasada < CurrentModelNegocio.Quantidade) || (CurrentModelNegocio.QuantidadeCasada == CurrentModelNegocio.Quantidade))
                {
                    if (this.ConfirmarAlteracaoNegocioCasado())
                    {
                        if (this.ConfirmarAlteracaoNegocio())
                        {
                            this.DigitacaoNegocio();
                        }
                    }
                }
                else
                {
                    if (this.ConfirmarAlteracaoNegocio())
                    {
                        this.DigitacaoNegocio();
                    }

                }

            }

        }

        private void menuDtgNegAlteracaoNegocio_Loaded(object sender, RoutedEventArgs e)
        {
            if (sender is SinacorContextMenuItem)
            {
                if (!_presenter.Permissoes.PermiteManutencaoNegocio || detailsViewNegocios.SelectedItems.Count < 1)
                {
                    ((SinacorContextMenuItem)sender).IsEnabled = false;
                }
                else
                    ((SinacorContextMenuItem)sender).IsEnabled = true;
            }
        }

        private void menuDtgNegCancelarNegocio_Click(object sender, RoutedEventArgs e)
        {

            if (detailsViewNegocios.SelectedItems.Count > 0)
            {
                Model.Negocio negocio = (Model.Negocio)detailsViewNegocios.SelectedItem;

                this.ExcluirNegocio((Model.NoNegocio)negocio);

            }

        }

        private void menuDtgNegCancelarNegocio_Loaded(object sender, RoutedEventArgs e)
        {
            if (sender is SinacorContextMenuItem)
            {
                if (!_presenter.Permissoes.PermiteManutencaoNegocio || detailsViewNegocios.SelectedItems.Count < 1)
                {
                    ((SinacorContextMenuItem)sender).IsEnabled = false;
                }
                else
                    ((SinacorContextMenuItem)sender).IsEnabled = true;
            }
        }
        #endregion

        #region MenuGridExecsOrdem
        private void menuDtgExecsOrdemDescasar_Click(object sender, RoutedEventArgs e)
        {
            if (sender is SinacorContextMenuItem)
            {
                Descasar();
            }
        }

        private void Descasar()
        {
            ModelCollection<Model.Negocio> negocios = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio>();

            foreach (Model.Negocio item in DtgExecsOrdem.SelectedItems)
            {
                negocios.Add(item);
            }

            _presenter.DescasarNegocios(negocios, true);

            this.CarregarNegocios();

            this._presenter.AtualizarEstadoOrdem();

            ((Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow)detailsViewOrdens.ItemContainerGenerator.ContainerFromItem(CurrentModelOrdem)).ApplyStyle();


            if (CurrentModelOrdem.QuantidadeExecutada == 0)
            {

                ((Model.NoSituacaoCasamento)_presenter.OrdemAtual.Parent).Children.Remove(_presenter.OrdemAtual);

                Model.NoSituacaoCasamento noSituacaoCasamento = null;

                foreach (Model.NoSituacaoCasamento item in ((Model.NoDiscricionaria)_presenter.OrdemAtual.Parent.Parent).Children)
                {
                    if (item.Situacao == Model.Enum.SituacaoCasamento.NaoCasada)
                    {
                        noSituacaoCasamento = item;
                        break;
                    }
                }

                ModelCollection<Model.NoOrdem> source = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.NoOrdem>();

                foreach (var item in detailsViewOrdens.Items)
                {
                    source.Add((Model.NoOrdem)item);
                }

                source.Remove(CurrentModelOrdem);
                detailsViewOrdens.ItemsSource = source;
                this.detailsViewOrdens.UpdateTarget(Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow.ItemProperty);

                Model.NoOrdem novoNo = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.NoOrdem(noSituacaoCasamento, _presenter.OrdemAtual);

                noSituacaoCasamento.Children.Add(novoNo);
                _presenter.OrdemAtual.AtualizarText();
            }
        }

        private void menuDtgExecsOrdemDescasar_Loaded(object sender, RoutedEventArgs e)
        {
            if (sender is SinacorContextMenuItem)
            {
                if (!_presenter.Permissoes.PermiteManutencaoNegocio || DtgExecsOrdem.SelectedItems.Count < 1)
                {
                    ((SinacorContextMenuItem)sender).IsEnabled = false;
                }
            }
        }
        #endregion

        #region MenuGridNegDisp
        private void menuDtgNegNaoCasados_Click(object sender, RoutedEventArgs e)
        {
            if (sender is SinacorContextMenuItem)
            {
                Casar();
            }
        }

        private void Casar()
        {
            ModelCollection<Model.Negocio> negocios = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio>();

            foreach (Model.Negocio item in DtgNegNaoCasados.SelectedItems)
            {
                item.Ordem = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.ChaveOrdem()
                {
                    DataOrdem = CurrentModelOrdem.DataOrdem,
                    NumeroOrdem = CurrentModelOrdem.NumeroOrdem.Value,
                    NumeroOrdemSubSequencia = CurrentModelOrdem.NumeroOrdemSubSequencia.Value
                };
                negocios.Add(item);
            }

            Model.ChaveOrdem chave = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.ChaveOrdem();

            chave.DataOrdem = CurrentModelOrdem.DataOrdem;
            chave.NumeroOrdem = CurrentModelOrdem.NumeroOrdem.Value;
            chave.NumeroOrdemSubSequencia = CurrentModelOrdem.NumeroOrdemSubSequencia.Value;

            if (_presenter.CasarNegocios(chave, negocios))
            {
                this.CarregarNegocios();

                this._presenter.AtualizarEstadoOrdem();

                ((Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow)detailsViewOrdens.ItemContainerGenerator.ContainerFromItem(CurrentModelOrdem)).ApplyStyle();

                ((Model.NoSituacaoCasamento)CurrentModelOrdem.Parent).Children.Remove(_presenter.OrdemAtual);

                Model.NoSituacaoCasamento noSituacaoCasamento = null;

                foreach (Model.NoSituacaoCasamento item in ((Model.NoDiscricionaria)CurrentModelOrdem.Parent.Parent).Children)
                {
                    if (item.Situacao == Model.Enum.SituacaoCasamento.Casada || item.Situacao == Model.Enum.SituacaoCasamento.ParcialmenteCasada)
                    {
                        noSituacaoCasamento = item;
                        break;
                    }
                }

                Model.NoOrdem novoNo = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.NoOrdem(noSituacaoCasamento, _presenter.OrdemAtual);

                noSituacaoCasamento.Children.Add(novoNo);

                ModelCollection<Model.NoOrdem> source = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.NoOrdem>();

                foreach (var item in detailsViewOrdens.Items)
                {
                    source.Add((Model.NoOrdem)item);
                }

                source.Remove(_presenter.OrdemAtual);
                detailsViewOrdens.ItemsSource = source;
                this.detailsViewOrdens.UpdateTarget(Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow.ItemProperty);

                _presenter.OrdemAtual.AtualizarText();

                _presenter.NegociosExecutados = new ModelCollection<Model.Negocio>();
                _presenter.NegociosDisponiveis = new ModelCollection<Model.Negocio>();

                this.DtgExecsOrdem.ItemsSource = _presenter.NegociosExecutados;
                this.DtgNegNaoCasados.ItemsSource = _presenter.NegociosDisponiveis;
            }
        }

        private void menuDtgNegNaoCasados_Loaded(object sender, RoutedEventArgs e)
        {
            if (sender is SinacorContextMenuItem)
            {
                if (!_presenter.Permissoes.PermiteManutencaoNegocio || DtgNegNaoCasados.SelectedItems.Count < 1)
                {
                    ((SinacorContextMenuItem)sender).IsEnabled = false;
                }
            }
        }
        #endregion

        #region MenuGridPreBoletos
        private void menuPreBoletosCasamento_Click(object sender, RoutedEventArgs e)
        {
            this.CasarPreBoletos(CurrentModelOrdem);
        }

        private void menuPreBoletosCasamento_Loaded(object sender, RoutedEventArgs e)
        {
            if (sender is SinacorContextMenuItem)
            {
                if (!_presenter.Permissoes.PermiteManutencaoNegocio || this.DtgPreBoletos.SelectedItems.Count < 1)
                {
                    ((SinacorContextMenuItem)sender).IsEnabled = false;
                }
            }
        }

        private void menuPreBoletosExcluir_Click(object sender, RoutedEventArgs e)
        {

            ModelCollection<Model.PreBoleto> preBoletos = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.PreBoleto>();


            foreach (Model.PreBoleto item in DtgPreBoletos.SelectedItems)
            {
                preBoletos.Add((Model.PreBoleto)item);
            }


            if (preBoletos.Count > 0)
                this.ExcluirPreBoletos(preBoletos);
        }

        private void menuPreBoletosExcluir_Loaded(object sender, RoutedEventArgs e)
        {
            if (sender is SinacorContextMenuItem)
            {
                if (!_presenter.Permissoes.PermiteManutencaoNegocio || this.DtgPreBoletos.SelectedItems.Count < 1)
                {
                    ((SinacorContextMenuItem)sender).IsEnabled = false;
                }
            }
        }
        #endregion

        #region MenuTreeView

        private void menuDataPregao_Click(object sender, RoutedEventArgs e)
        {
            this.ShowUserWaitingProcess();
            this.CarregarDataPregao(CurrentModelDataPregao);
            this._dataPregaoAtual = CurrentModelDataPregao;
            this.HideUserWaitingProcess();
        }

        private void menuDataPregao_Loaded(object sender, RoutedEventArgs e)
        {
            if (sender is SinacorContextMenuItem)
            {
                if (this.treeView.Items.Count < 1 || this.treeView.SelectedItem == null || !(this.treeView.SelectedItem is Model.NoDataPregao))
                {
                    ((SinacorContextMenuItem)sender).IsEnabled = false;
                }
                else
                    ((SinacorContextMenuItem)sender).IsEnabled = true;
            }
        }

        #endregion

        #region IConsultaGeralOrdensNegocios Members

        /// <summary>
        /// Apresenta a cor de um negócio não casado
        /// Armazenar na variável de estilo a referência a cor GridRowBusiness06
        /// </summary>
        public void ApresentarNegocioNaoCasado()
        {
            _style = Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow.DataGridRowBusiness06;
        }

        /// <summary>
        /// Apresenta a cor de um negócio parcialmente casado
        /// Armazenar na variável de estilo a referência a cor GridRowBusiness04
        /// </summary>
        public void ApresentarNegocioParcialmenteCasado()
        {
            _style = Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow.DataGridRowBusiness04;
        }

        /// <summary>
        /// Apresenta a cor de um negócio cancelado
        /// Armazenar na variável de estilo a referência a cor GridRowBusiness10
        /// </summary>
        public void ApresentarNegocioCancelado()
        {
            _style = Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow.DataGridRowBusiness10;
        }

        /// <summary>
        /// Apresenta a cor de um pré-boleto casado
        /// Atribuir a cor Azul (GridRowBusiness02) para o pré-boleto
        /// </summary>
        public void ApresentarPreBoletoCasado()
        {
            _style = Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow.DataGridRowBusiness02;
        }

        /// <summary>
        /// Apresenta a cor de um pré-boleto não casado
        /// Atribuir a cor Vermelha (GridRowBusiness06) para o pré-boleto
        /// </summary>
        public void ApresentarPreBoletoNaoCasado()
        {
            _style = Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow.DataGridRowBusiness06;
        }

        /// <summary>
        /// Apresenta a cor de um pré-boleto parcialmente casado
        /// Atribuir a cor Verde (GridRowBusiness04) para o pré-boleto
        /// </summary>
        public void ApresentarPreBoletoParcialmenteCasado()
        {
            _style = Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow.DataGridRowBusiness04;
        }

        /// <summary>
        /// Atualiza o data grid light de Negócios não casados
        /// </summary>
        public void AtualizarNegociosDisponiveis()
        {
            DtgNegNaoCasados.ItemsSource = _presenter.NegociosDisponiveis;
            DtgNegNaoCasados.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        /// <summary>
        /// Atualiza o data grid light de Execuções da ordem
        /// </summary>
        public void AtualizarNegociosExecutados()
        {
            DtgExecsOrdem.ItemsSource = _presenter.NegociosExecutados;
            DtgExecsOrdem.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        /// <summary>
        /// Atualiza o data grid light de Pré-Boletos
        /// </summary>
        public void AtualizarPreBoletos()
        {
            DtgPreBoletos.ItemsSource = _presenter.PreBoletos;
            DtgPreBoletos.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        /// <summary>
        /// Atualiza a estrutura da treeview
        /// Realizar um update target na propriedade TreeViewItemsSource do SinacorExplorer
        /// </summary>
        public void AtualizarTreeView()
        {
            //treeView.UpdateTarget(SinacorExplorer.TreeViewItemsSource); 
            treeView.UpdateTarget(SinacorTreeView.ItemsSourceProperty);
        }

        /// <summary>
        /// Solicita a confirmação do usuário para a alteração de um negócio
        /// Apresenta a mensagem da resource key "Bovespa.Ordens.Message.AlterarNegocio", com as opções "Sim" e "Não"
        /// </summary>
        /// <returns></returns>
        public bool ConfirmarAlteracaoNegocio()
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.Ordens.Message.AlterarNegocio").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }

        /// <summary>
        /// Solicita a confirmação do usuário para a alteração de um negócio já casado
        /// Apresenta a mensagem da resource key "Bovespa.Ordens.Message.AlterarNegocioCasado", com as opções "Sim" e "Não"
        /// </summary>
        /// <returns></returns>
        public bool ConfirmarAlteracaoNegocioCasado()
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.Ordens.Message.AlterarNegocioCasado").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }

        /// <summary>
        /// Solicita a confirmação do usuário para a alteração de uma ordem
        /// Apresenta a mensagem da resource key "Bovespa.Ordens.Message.AlterarOrdem", com as opções "Sim" e "Não"
        /// </summary>
        /// <returns></returns>
        public bool ConfirmarAlteracaoOrdem()
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.Ordens.Message.AlterarOrdem").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }

        /// <summary>
        /// Solicita a confirmação do usuário para a alteração de uma ordem já casada
        /// Apresenta a mensagem da resource key "Bovespa.Ordens.Message.OrdemCasada", com as opções "Sim" e "Não"
        /// </summary>
        /// <returns></returns>
        public bool ConfirmarAlteracaoOrdemCasada()
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.Ordens.Message.OrdemCasada").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }

        /// <summary>
        /// Solicita a confirmação do usuário para o cancelamento das ordens seleciondas
        /// Apresenta a mensagem da resource key "Bovespa.ManutencaoOrdens.Message.ConfirmaCancelamentoOrdem", com as opções "Sim" e "Não"
        /// </summary>
        /// <returns></returns>
        public bool ConfirmarCancelamentoOrdens()
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.ManutencaoOrdens.Message.ConfirmaCancelamentoOrdem").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);
            return (result == SinacorMessageBoxResult.Yes);
        }

        /// <summary>
        /// Solicita a confirmação do usuário para o casamento dos negócios selecionados com uma determinada ordem
        /// Apresenta a mensagem da resource key "Bovespa.Ordens.Message.CasamentoOrdemXNegocio", com as opções "Sim" e "Não"
        /// </summary>
        /// <returns></returns>
        public bool ConfirmarCasamento()
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.Ordens.Message.CasamentoOrdemXNegocio").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }

        /// <summary>
        /// Solicita a confirmação do casamento dos pré-boletos para uma determinada ordem
        /// Apresenta a mensagem da resource key "Bovespa.Ordens.Message.CasamentoPreBoletos", com as opções "Sim" e "Não"
        /// </summary>
        /// <returns></returns>
        public bool ConfirmarCasamentoPreBoletos()
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.ManutencaoOrdens.Message.CasamentoPreBoletos").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }

        /// <summary>
        /// Solicita a confirmação do usuário para o descasamento dos negócios selecionados com uma determinada ordem
        /// Apresenta a mensagem da resource key "Bovespa.Ordens.Message.DescasamentoExecucao", com as opções "Sim" e "Não"
        /// </summary>
        /// <returns></returns>
        public bool ConfirmarDescasamento()
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.Ordens.Message.DescasamentoExecucao").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }

        /// <summary>
        /// Solicita a confirmação do usuário para a exclusão dos negócios selecionados
        /// Apresenta a mensagem da resource key "Bovespa.Ordens.Message.ConfirmarCancelamentoNegocio", com as opções "Sim" e "Não"
        /// </summary>
        /// <returns></returns>
        public bool ConfirmarExclusaoNegocio()
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.Ordens.Message.ConfirmarCancelamentoNegocio").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }

        /// <summary>
        /// Solicita a confirmação do usuário para a exclusão dos pré-boletos selecionados
        /// Apresenta a mensagem da resource key "Bovespa.ManutencaoOrdens.Message.ExclusaoPreBoleto", com as opções "Sim" e "Não"
        /// </summary>
        /// <returns></returns>
        public bool ConfirmarExclusaoPreBoletos()
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.ManutencaoOrdens.Message.ExclusaoPreBoleto").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }

        #endregion

        #region Eventos
        private void dragDrop_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
        {
            // Cancela o drag quando o flag for true
            if (_cancelDrag)
            {
                e.Action = DragAction.Cancel;
                e.Handled = true;
                _cancelDrag = false;
            }
        }

        /// <summary>
        /// Evento que ocorre quando o tipo de visualização muda via combo (visualização por lista ou por detalhes)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void explorer_SelectedViewChanged(object sender, RoutedPropertyChangedEventArgs<string> e)
        {
            if (detailsViewOrdens != null)
            {
                switch (e.NewValue)
                {

                    // Visualização por lista
                    case ExplorerListView.ListView:
                        detailsViewOrdens.Visibility = Visibility.Collapsed;
                        detailsViewNegocios.Visibility = Visibility.Collapsed;
                        listView.Visibility = Visibility.Visible;
                        break;

                    // Visualização por detalhes
                    case ExplorerDetailsView.DetailsView:
                        this.ControlarVisao();
                        break;
                    default:
                        break;
                }

            }

        }

        private void treeView_BufferedSelectionChanged(object sender, BufferedEventArgs<SelectionChangedEventArgs> e)
        {
            // Preenche os itens do ListView e do DataGrid

            DtgPreBoletos.Visibility = Visibility.Collapsed;
            DtgExecsOrdem.Visibility = Visibility.Collapsed;
            DtgNegNaoCasados.Visibility = Visibility.Collapsed;
            expExecucoesOrdem.Visibility = Visibility.Collapsed;
            expNegociosNaoCasados.Visibility = Visibility.Collapsed;
            expPreBoletos.Visibility = Visibility.Collapsed;

            this.LimparNegocios();
            this.LimparPreBoletos();

            if (!(treeView.SelectedItem is Model.NoDescarte))
            {

                if (treeView.SelectedItem is Model.NoOrdem || treeView.SelectedItem is Model.NoSituacaoCasamento)
                {

                    if (treeView.SelectedItem is Model.NoOrdem)
                    {
                        Model.NoOrdem noOrdem = treeView.SelectedItem as Model.NoOrdem;
                        ModelCollection<Model.Ordem> source = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Ordem>();

                        source.Add((Model.Ordem)noOrdem);

                        detailsViewOrdens.ItemsSource = source;
                        listView.ItemsSource = source;
                        this.detailsViewOrdens.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                        this.listView.UpdateTarget(SinacorListView.ItemsSourceProperty);

                        detailsViewNegocios.Visibility = Visibility.Collapsed;
                        detailsViewOrdens.Visibility = Visibility.Visible;
                    }
                    else if (((Model.NoSituacaoCasamento)treeView.SelectedItem).Parent.Parent is Model.NoTipoObjetoConsulta)
                    {
                        ModelCollection<Model.Ordem> source = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Ordem>();

                        foreach (Model.NoOrdem item in ((Model.NoSituacaoCasamento)treeView.SelectedItem).Children)
                        {
                            source.Add((Model.Ordem)item);
                        }

                        detailsViewOrdens.ItemsSource = source;
                        listView.ItemsSource = source;
                        this.detailsViewOrdens.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                        this.listView.UpdateTarget(SinacorListView.ItemsSourceProperty);
                        detailsViewNegocios.Visibility = Visibility.Collapsed;
                        detailsViewOrdens.Visibility = Visibility.Visible;
                    }

                }
                if (treeView.SelectedItem is Model.NoNegocio || treeView.SelectedItem is Model.NoSituacaoCasamento)
                {
                    if (treeView.SelectedItem is Model.NoNegocio)
                    {
                        Model.NoNegocio noNegocio = treeView.SelectedItem as Model.NoNegocio;
                        ModelCollection<Model.Negocio> source = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio>();

                        source.Add((Model.Negocio)noNegocio);

                        detailsViewNegocios.ItemsSource = source;
                        listView.ItemsSource = source;
                        this.detailsViewNegocios.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                        this.listView.UpdateTarget(SinacorListView.ItemsSourceProperty);

                        detailsViewNegocios.Visibility = Visibility.Visible;
                        detailsViewOrdens.Visibility = Visibility.Collapsed;

                    }
                    else if (((Model.NoSituacaoCasamento)treeView.SelectedItem).Parent is Model.NoTipoObjetoConsulta)
                    {

                        ModelCollection<Model.Negocio> source = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio>();

                        foreach (Model.NoNegocio item in ((Model.NoSituacaoCasamento)treeView.SelectedItem).Children)
                        {
                            source.Add((Model.Negocio)item);
                        }

                        detailsViewNegocios.ItemsSource = source;
                        listView.ItemsSource = source;
                        this.detailsViewNegocios.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                        this.listView.UpdateTarget(SinacorListView.ItemsSourceProperty);
                        detailsViewNegocios.Visibility = Visibility.Visible;
                        detailsViewOrdens.Visibility = Visibility.Collapsed;
                    }
                }
            }

        }


        /// <summary>
        /// Evento disparado quando o objeto arrastado passa por cima do destino
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView_DragOver(object sender, DragEventArgs e)
        {
            // O evento DragOver pode ser utilizado para bloquear o drop sobre algum item.
            // Capturando items arrastados
            IList droppedItems = e.Data.GetData(typeof(IEnumerable)) as IList;

            // Verifica se foi um drag de itens
            if (droppedItems != null && droppedItems.Count > 0)
            {
                var origem = e.Source as SinacorTreeViewItem;
                if (origem != null)
                {
                    // Drag no SinacorTreeViewItem                                     
                    foreach (IHierarchicalItem item in droppedItems)
                    {
                        if (!_presenter.ValidarMovimento(item, origem.Header as IHierarchicalItem))
                        {
                            e.Effects = DragDropEffects.None;
                            e.Handled = true;
                            break;
                        }
                    }
                }
            }
        }

        private void treeView_Drop(object sender, DragEventArgs e)
        {
            // O evento Drop é utilizado para capturar os itens soltos sobre o controle.
            // Capturando origem do drag
            ItemsControl itemsControl = e.Data.GetData(typeof(IItemsControlDragSource)) as ItemsControl;

            // Capturando items arrastados
            IList droppedItems = e.Data.GetData(typeof(IEnumerable)) as IList;

            // Verifica se foi um drop de itens
            if (droppedItems != null && droppedItems.Count > 0)
            {
                var origem = e.Source as SinacorTreeViewItem;

                if (origem != null)
                {
                    if (origem.Header is Model.NoDescarte)
                    {
                        if (droppedItems[0] is Model.NoOrdem)
                        {
                            this.CancelarOrdem((Model.NoOrdem)droppedItems[0]);
                        }
                        else if (droppedItems[0] is Model.NoNegocio)
                        {
                            this.ExcluirNegocio((Model.NoNegocio)droppedItems[0]);
                        }
                    }
                    else
                    {
                        if (droppedItems[0] is Model.NoOrdem)
                        {
                            ModelCollection<Model.NoOrdem> ordens = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.NoOrdem>();
                            foreach (Model.NoOrdem item in droppedItems)
                            {
                                ordens.Add((Model.NoOrdem)item);
                            }

                            this.AlterarOrdens(ordens, origem.Header as IHierarchicalItem);
                        }
                        else if (droppedItems[0] is Model.NoNegocio)
                        {
                            ModelCollection<Model.NoNegocio> negocios = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.NoNegocio>();
                            foreach (Model.NoNegocio item in droppedItems)
                            {
                                negocios.Add((Model.NoNegocio)item);
                            }

                            this.AlterarNegocios(negocios, origem.Header as IHierarchicalItem);
                        }
                    }
                }

            }

        }

        private void itemsView_Drop(object sender, DragEventArgs e)
        {
            // O exemplo abaixo utiliza o mesmo event handler para tratar Drop no 
            // SinacorListView e no SinacorDataGrid. Ambos os controles implementam
            // a interface IItemContainerDropTarget e seus itens implementam a 
            // IItemContainerDropTarget

            // Capturando origem do drag
            //ItemsControl itemsControl = e.Data.GetData(typeof(IItemsControlDragSource)) as ItemsControl;
            ItemsControl itemsControl = e.Data.GetData(typeof(IItemsControlDragSource)) as ItemsControl;
            // Capturando items arrastados
            IList droppedItems = e.Data.GetData(typeof(IEnumerable)) as IList;

            // Verifica se foi um drop de itens
            if (droppedItems != null && droppedItems.Count > 0)
            {
                if (e.Source is IItemContainerDropTarget)
                {
                    // Drop no SinacorListViewItem ou DataGridRow
                }
                else if (e.Source is IItemsControlDropTarget)
                {
                    // Drop no SinacorListView ou SinacorDataGrid
                }
            }
        }

        private void DtgExecsOrdem_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {
            if (e.ItemInfo.Item != null)
            {
                if (e.OriginalSource is Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow)
                {
                    e.Style = Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow.DataGridRowBusiness02;
                }
            }
        }

        private void DtgNegNaoCasados_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {
            if (e.ItemInfo.Item != null)
            {
                _style = string.Empty;
                if (e.OriginalSource is Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow)
                {
                    this._presenter.VerificarEstadoNegocio(((Model.Negocio)e.ItemInfo.Item));
                }
                e.Style = _style;
            }
        }

        private void DtgPreBoletos_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {
            if (e.ItemInfo.Item != null)
            {
                _style = string.Empty;
                if (e.OriginalSource is Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow)
                {
                    this._presenter.VerificarEstadoPreBoleto(((Model.PreBoleto)e.ItemInfo.Item));
                }
                e.Style = _style;
            }
        }

        private void detailsViewOrdens_BufferedSelectionChanged(object sender, BufferedEventArgs<SelectionChangedEventArgs> e)
        {
            if (CurrentModelOrdem != null)
            {
                this._presenter.OrdemAtual = CurrentModelOrdem;
                this.CarregarNegocios();

                _presenter.PreBoletos = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.PreBoleto>();

                Model.ChaveOrdem chave = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.ChaveOrdem();

                chave.NumeroOrdem = CurrentModelOrdem.NumeroOrdem.Value;
                chave.DataOrdem = CurrentModelOrdem.DataOrdem;

                this._presenter.ConsultarPreBoletos(chave);
            }

        }

        private void detailsViewOrdens_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {
            if (e.ItemInfo.Item != null)
            {
                _style = string.Empty;
                if (e.OriginalSource is Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow)
                {
                    this._presenter.VerificarEstadoOrdem(((Model.Ordem)e.ItemInfo.Item));
                }
                e.Style = _style;
            }
        }

        private void detailsViewNegocios_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {
            if (e.ItemInfo.Item != null)
            {
                _style = string.Empty;
                if (e.OriginalSource is Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow)
                {
                    this._presenter.VerificarEstadoNegocio(((Model.Negocio)e.ItemInfo.Item));
                }
                e.Style = _style;
            }
        }

        #endregion

        #region Metodos

        private void DigitacaoNegocio()
        {
            CadastramentoNegocio cadastramentoNegocio = new CadastramentoNegocio();
            Ordens.Model.ModelCadastroNegocio modelCadastroNegocio = new Sinacor.UI.Bovespa.Ordens.Model.ModelCadastroNegocio();

            modelCadastroNegocio.Numero = CurrentModelNegocio.Numero;
            modelCadastroNegocio.DataPregao = CurrentModelNegocio.DataPregao;
            modelCadastroNegocio.TituloCodigo = CurrentModelNegocio.Codigo;
            modelCadastroNegocio.TipoNaturezaOperacao = (Ordens.Model.Enum.TipoNaturezaOperacao)CurrentModelNegocio.NaturezaOperacao.Value;
            modelCadastroNegocio.Bolsa = CurrentModelNegocio.Bolsa;
            cadastramentoNegocio.CarregarParametros(modelCadastroNegocio);
            cadastramentoNegocio.SetMenuHeader("Bovespa.Ordens.Label.CasamentoPreBoleto");
            cadastramentoNegocio.Owner = this;
            cadastramentoNegocio.ShowDialog();


            if (cadastramentoNegocio._presenter.NegocioAtual != null)
            {
                if (treeView.SelectedItem is Model.NoNegocio || treeView.SelectedItem is Model.NoSituacaoCasamento)
                {
                    if (treeView.SelectedItem is Model.NoNegocio)
                    {
                        Model.NoNegocio noNegocio = CurrentModelNegocio;

                        this.TraduzirNegocio(ref noNegocio, cadastramentoNegocio._presenter.NegocioAtual);

                        noNegocio.AtualizarText();

                        ModelCollection<Model.Negocio> source = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio>();

                        source.Add((Model.Negocio)noNegocio);
                        detailsViewNegocios.ItemsSource = source;

                        this.detailsViewNegocios.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);

                        detailsViewNegocios.Visibility = Visibility.Visible;
                        detailsViewOrdens.Visibility = Visibility.Collapsed;

                    }
                    else if (((Model.NoSituacaoCasamento)treeView.SelectedItem).Parent is Model.NoTipoObjetoConsulta)
                    {

                        Model.NoNegocio noNegocio = detailsViewNegocios.SelectedItem as Model.NoNegocio;

                        this.TraduzirNegocio(ref noNegocio, cadastramentoNegocio._presenter.NegocioAtual);

                        noNegocio.AtualizarText();

                        ModelCollection<Model.NoNegocio> source = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.NoNegocio>();


                        foreach (Model.NoNegocio item in ((Model.NoSituacaoCasamento)treeView.SelectedItem).Children)
                        {
                            if (item.DataNegocio == noNegocio.DataNegocio && item.Numero == noNegocio.Numero)
                            {
                                source.Add(noNegocio);
                            }
                            else
                                source.Add(item);
                        }

                        detailsViewNegocios.ItemsSource = source;

                        this.detailsViewNegocios.UpdateTarget(Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow.ItemProperty);

                        detailsViewNegocios.Visibility = Visibility.Visible;
                        detailsViewOrdens.Visibility = Visibility.Collapsed;

                    }
                }
            }
        }

        private void LimparNegocios()
        {
            _presenter.NegociosDisponiveis = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio>();
            this.AtualizarNegociosDisponiveis();

            _presenter.NegociosExecutados = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio>();
            this.AtualizarNegociosExecutados();
        }

        private void LimparPreBoletos()
        {
            _presenter.PreBoletos = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.PreBoleto>();
            this.AtualizarPreBoletos();
        }


        /// <summary>
        /// Método para mover negocio(s) de lugar
        /// </summary>
        /// <param name="nosNegocio"></param>
        /// <param name="destino"></param>
        private void AlterarNegocios(ModelCollection<Model.NoNegocio> nosNegocio, IHierarchicalItem destino)
        {
            this._presenter.AlterarNegocios(nosNegocio, destino);
        }


        /// <summary>
        /// Método para mover ordem(s) de lugar
        /// </summary>
        /// <param name="nosNegocio"></param>
        /// <param name="destino"></param>
        private void AlterarOrdens(ModelCollection<Model.NoOrdem> nosOrdem, IHierarchicalItem destino)
        {
            this._presenter.AlterarOrdens(nosOrdem, destino);

            foreach (Model.NoOrdem item in nosOrdem)
            {
                item.AtualizarText();
            }

            ((Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow)detailsViewOrdens.ItemContainerGenerator.ContainerFromItem(nosOrdem[0])).ApplyStyle();

        }

        /// <summary>
        /// Método para cancelar negócio
        /// </summary>
        /// <param name="negocio"></param>
        private void ExcluirNegocio(Model.NoNegocio negocio)
        {
            if (negocio != null)
            {
                ClearServiceErrors();
                this.ShowUserWaitingProcess();

                if (this._presenter.ExcluirNegocio(negocio))
                {
                    ((Model.NoSituacaoCasamento)negocio.Parent).Children.Remove(negocio);

                    ModelCollection<Model.Negocio> source = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio>();

                    foreach (var item in ((Model.NoSituacaoCasamento)negocio.Parent).Children)
                    {
                        source.Add((Model.Negocio)item);
                    }

                    detailsViewNegocios.ItemsSource = source;
                    this.detailsViewNegocios.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
                }

                this.HideUserWaitingProcess();
            }
        }

        /// <summary>
        /// Método para cancelar ordem
        /// </summary>
        /// <param name="negocio"></param>
        private void CancelarOrdem(Model.NoOrdem ordem)
        {
            if (ordem != null)
            {
                ClearServiceErrors();
                this.ShowUserWaitingProcess();

                if (this._presenter.CancelarOrdem(ordem))
                {
                    this.LimparPreBoletos();
                    this.LimparNegocios();
                    expExecucoesOrdem.Visibility = Visibility.Collapsed;
                    expNegociosNaoCasados.Visibility = Visibility.Collapsed;

                    ordem.QuantidadeExecutada = 0;
                    ordem.AtualizarText();

                    ((Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow)detailsViewOrdens.ItemContainerGenerator.ContainerFromItem(ordem)).ApplyStyle();

                    this.detailsViewOrdens.UpdateTarget(Sinacor.Infra.UI.Controls.SmartClient.DataGrid.DataGridRow.ItemProperty);

                }

                this.HideUserWaitingProcess();
            }
        }

        /// <summary>
        /// Método para casar negocio(s)
        /// </summary>
        /// <param name="ordem"></param>
        /// <param name="negocios"></param>
        private void CasarNegocios(Model.ChaveOrdem ordem, ModelCollection<Model.Negocio> negocios)
        {
            this._presenter.CasarNegocios(ordem, negocios);
        }


        /// <summary>
        /// Método para casar pré-boleto
        /// </summary>
        /// <param name="ordem"></param>
        private void CasarPreBoletos(Model.NoOrdem ordem)
        {

            if (ordem != null)
            {
                ClearServiceErrors();
                this.ShowUserWaitingProcess();

                if (this._presenter.CasarPreBoletos(ordem))
                {

                    ((Model.NoSituacaoCasamento)ordem.Parent).Children.Remove(ordem);

                    Model.NoSituacaoCasamento noSitCas = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.NoSituacaoCasamento((Model.NoDiscricionaria)ordem.Parent.Parent, Model.Enum.SituacaoCasamento.Casada);

                    foreach (var item in ((Model.NoDiscricionaria)ordem.Parent.Parent).Children)
                    {
                        if (item.Situacao == Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.SituacaoCasamento.Casada)
                        {
                            noSitCas = item;
                            break;
                        }
                    }

                    ordem.QuantidadeExecutada = ordem.Quantidade;
                    noSitCas.Children.Add(ordem);
                    ordem.AtualizarText();

                    ModelCollection<Model.Ordem> source = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Ordem>();

                    foreach (var item in ((Model.NoSituacaoCasamento)ordem.Parent).Children)
                    {
                        source.Add((Model.Ordem)item);
                    }

                    detailsViewOrdens.ItemsSource = source;
                    this.detailsViewOrdens.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);

                    expPreBoletos.Visibility = Visibility.Collapsed;
                    DtgPreBoletos.Visibility = Visibility.Collapsed;

                }

                this.HideUserWaitingProcess();
            }

        }

        /// <summary>
        /// Método para descasar negócio(s)
        /// </summary>
        /// <param name="negocios"></param>
        /// <param name="solicitaConfirmacao"></param>
        private void DescasarNegocios(ModelCollection<Model.Negocio> negocios, bool solicitaConfirmacao)
        {
            this._presenter.DescasarNegocios(negocios, solicitaConfirmacao);
        }

        /// <summary>
        /// Método para excluir pré-boetos
        /// </summary>
        /// <param name="preBoletos"></param>
        private void ExcluirPreBoletos(ModelCollection<Model.PreBoleto> preBoletos)
        {
            if (preBoletos != null)
            {
                ClearServiceErrors();
                this.ShowUserWaitingProcess();

                if (_presenter.ExcluirPreBoletos(preBoletos))
                {
                    ((Model.NoSituacaoCasamento)CurrentModelOrdem.Parent).Children.Remove(_presenter.OrdemAtual);

                    Model.NoSituacaoCasamento noSitCas = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.NoSituacaoCasamento((Model.NoDiscricionaria)_presenter.OrdemAtual.Parent.Parent, Model.Enum.SituacaoCasamento.NaoCasada);

                    foreach (var item in ((Model.NoDiscricionaria)CurrentModelOrdem.Parent.Parent).Children)
                    {
                        if (item.Situacao == Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.SituacaoCasamento.NaoCasada)
                        {
                            noSitCas = item;
                            break;
                        }
                    }

                    _presenter.OrdemAtual.QuantidadeExecutada = 0;
                    noSitCas.Children.Add(_presenter.OrdemAtual);
                    _presenter.OrdemAtual.AtualizarText();

                    ModelCollection<Model.Ordem> source = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Ordem>();

                    foreach (var item in ((Model.NoSituacaoCasamento)_presenter.OrdemAtual.Parent).Children)
                    {
                        source.Add((Model.Ordem)item);
                    }

                    detailsViewOrdens.ItemsSource = source;
                    this.detailsViewOrdens.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);

                    expPreBoletos.Visibility = Visibility.Collapsed;
                    DtgPreBoletos.Visibility = Visibility.Collapsed;

                }

                this.HideUserWaitingProcess();
            }

        }

        /// <summary>
        /// Método para carregar uma nova estrutura Ordem/Negócio
        /// </summary>
        /// <param name="noDataPregao"></param>
        private void CarregarDataPregao(Model.NoDataPregao noDataPregao)
        {
            this._presenter.CarregarDataPregao(noDataPregao);
        }

        private void CarregarNegocios()
        {
            this.ShowUserWaitingProcess();

            _presenter.NegociosExecutados = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio>();

            Model.ChaveOrdem filtro = new Sinacor.UI.Bovespa.ManutencaoOrdens.Model.ChaveOrdem();

            filtro.DataOrdem = CurrentModelOrdem.DataOrdem;
            filtro.NumeroOrdem = CurrentModelOrdem.NumeroOrdem.Value;
            filtro.NumeroOrdemSubSequencia = CurrentModelOrdem.NumeroOrdemSubSequencia.Value;

            _presenter.ConsultarNegociosCasados(filtro);

            _presenter.NegociosDisponiveis = new ModelCollection<Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Negocio>();

            _presenter.ConsultarNegociosDisponiveis(filtro);

            expExecucoesOrdem.Visibility = Visibility.Visible;
            expNegociosNaoCasados.Visibility = Visibility.Visible;
            DtgExecsOrdem.Visibility = Visibility.Visible;
            DtgNegNaoCasados.Visibility = Visibility.Visible;
            expPreBoletos.Visibility = Visibility.Collapsed;

            this.HideUserWaitingProcess();
        }

        private void TraduzirOrdem(ref Model.NoOrdem retorno, Model.Ordem ordem)
        {

            retorno.ApelidoCliente = ordem.ApelidoCliente;
            retorno.Ativo = ordem.Ativo;
            retorno.NomeBolsa = ordem.NomeBolsa;
            retorno.Carteira = ordem.Carteira;
            retorno.CasarDetalhes = ordem.CasarDetalhes;
            retorno.CodigoBolsa = ordem.CodigoBolsa;
            retorno.CodigoBrokerCliente = ordem.CodigoBrokerCliente;
            retorno.CodigoCasamento = ordem.CodigoCasamento;
            retorno.CodigoCliente = ordem.CodigoCliente;
            retorno.CodigoISIN = ordem.CodigoISIN;
            retorno.CodigoOperador = ordem.CodigoOperador;
            retorno.CodigoUsuario = ordem.CodigoUsuario;
            retorno.ComplementoNomeCliente = ordem.ComplementoNomeCliente;
            retorno.DataHoraOrdem = ordem.DataHoraOrdem;
            retorno.DataOrdem = ordem.DataOrdem;
            retorno.DataPregaoCasamento = ordem.DataPregaoCasamento;
            retorno.DataValidade = ordem.DataValidade;
            retorno.DescricaoAtivo = ordem.DescricaoAtivo;
            retorno.Detalhes = ordem.Detalhes;
            retorno.DigitoCliente = ordem.DigitoCliente;
            retorno.Discricionaria = ordem.Discricionaria;
            retorno.Distribuida = ordem.Distribuida;
            retorno.IndicadorCasaOrdem = ordem.IndicadorCasaOrdem;
            retorno.IndicadorClientePessoaVinculada = ordem.IndicadorClientePessoaVinculada;
            retorno.IndicadorDesprezaSaldo = ordem.IndicadorDesprezaSaldo;
            retorno.IndicadorGravaLog = ordem.IndicadorGravaLog;
            retorno.IndicadorLiquidacaoExterna = ordem.IndicadorLiquidacaoExterna;
            retorno.IndicadorOrdemAdmConcorrente = ordem.IndicadorOrdemAdmConcorrente;
            retorno.IndicadorOrigemMegaBolsa = ordem.IndicadorOrigemMegaBolsa;
            retorno.IndicadorSistemaExterno = ordem.IndicadorSistemaExterno;
            retorno.Justificativas = ordem.Justificativas;
            retorno.LoginOperador = ordem.LoginOperador;
            retorno.Mercado = ordem.Mercado;
            retorno.NaturezaOperacao = ordem.NaturezaOperacao;
            retorno.NomeCliente = ordem.NomeCliente;
            retorno.NomeEmissor = ordem.NomeEmissor;
            retorno.NumeroOrdem = ordem.NumeroOrdem;
            retorno.NumeroOrdemOriginal = ordem.NumeroOrdemOriginal;
            retorno.NumeroOrdemSubSequencia = ordem.NumeroOrdemSubSequencia;
            retorno.Observacao = ordem.Observacao;
            retorno.PercentualCorretagem = ordem.PercentualCorretagem;
            retorno.PercentualFinanciamento = ordem.PercentualFinanciamento;
            retorno.PossuiPreBoleto = ordem.PossuiPreBoleto;
            retorno.PrazoVencimentoTermo = ordem.PrazoVencimentoTermo;
            retorno.Preco = ordem.Preco;
            retorno.PrecoMedio = ordem.PrecoMedio;
            retorno.Quantidade = ordem.Quantidade;
            retorno.QuantidadeAnexoIV = ordem.QuantidadeAnexoIV;
            retorno.QuantidadeAnexoV = ordem.QuantidadeAnexoV;
            retorno.QuantidadeCanceladaOferta = ordem.QuantidadeCanceladaOferta;
            retorno.QuantidadeExecutada = ordem.QuantidadeExecutada;
            retorno.Situacao = ordem.Situacao;
            retorno.TipoDistribuicao = ordem.TipoDistribuicao;
            retorno.TipoDistribuicaoPermitida = ordem.TipoDistribuicaoPermitida;
            retorno.TipoLiquidacao = ordem.TipoLiquidacao;
            retorno.TipoOrdem = ordem.TipoOrdem;
            retorno.ValorDolar = ordem.ValorDolar;
            retorno.ValorFinanciamento = ordem.ValorFinanciamento;
            retorno.Volume = ordem.Volume;
            retorno.Saldo = ordem.Saldo;
            retorno.SituacaoCasamento = ordem.SituacaoCasamento;
            retorno.ValorOrdem = ordem.ValorOrdem;

        }

        private void TraduzirNegocio(ref Model.NoNegocio retorno, Bovespa.Ordens.Model.ModelCadastroNegocio negocio)
        {
            retorno.CodigoCliente = negocio.CodigoCorrespondente;
            retorno.Bolsa = negocio.Bolsa;
            retorno.ContraParte = negocio.ContraParte;
            retorno.DataPregao = negocio.DataPregao.Value;
            retorno.NaturezaOperacao = (Model.Enum.NaturezaOperacao)negocio.TipoNaturezaOperacao;
            retorno.Numero = negocio.Numero.Value;
            retorno.Quantidade = negocio.Quantidade;
            retorno.Preco = negocio.Preco;
            retorno.VencimentoTermo = negocio.VencimentoTermoOpcoes;
            retorno.TipoTermo = (Model.Enum.TipoTermo)negocio.TipoTermo;
            retorno.TipoLiquidacao = (Model.Enum.TipoLiquidacaoNegocio)negocio.TipoLiquidacaoNegocio;
            retorno.NaoLiquidaNota = negocio.NaoLiquidaNota;
            retorno.DiasLiquidacao = negocio.DiasLiquidacao;
            retorno.HoraNegocio = negocio.HoraNegocio;
        }

        private void ControlarVisao()
        {
            if (treeView.SelectedItem is Model.NoOrdem || treeView.SelectedItem is Model.NoSituacaoCasamento)
            {
                if (treeView.SelectedItem is Model.NoOrdem || ((Model.NoSituacaoCasamento)treeView.SelectedItem).Parent.Parent is Model.NoTipoObjetoConsulta)
                {
                    detailsViewOrdens.Visibility = Visibility.Visible;
                    detailsViewNegocios.Visibility = Visibility.Collapsed;
                    listView.Visibility = Visibility.Collapsed;
                }
            }

            if (treeView.SelectedItem is Model.NoNegocio || treeView.SelectedItem is Model.NoSituacaoCasamento)
            {
                if (treeView.SelectedItem is Model.NoNegocio || ((Model.NoSituacaoCasamento)treeView.SelectedItem).Parent is Model.NoTipoObjetoConsulta)
                {
                    detailsViewOrdens.Visibility = Visibility.Collapsed;
                    detailsViewNegocios.Visibility = Visibility.Visible;
                    listView.Visibility = Visibility.Collapsed;
                }
            }
        }

        #endregion

        private void DtgNegNaoCasados_Drop(object sender, DragEventArgs e)
        {
            Descasar();
        }

        private void DtgExecsOrdem_Drop(object sender, DragEventArgs e)
        {
            Casar();
        }

    }
}
